#include<stdio.h>
#include<stddef.h>

const int MAX = 3;

int main(){
    //变量地址
    int var1;
    char var2[10];

    printf("var1变量地址：%p\n", &var1);
    printf("var2变量地址：%p\n", &var2);

    //指针声明
    //var *varName, 其中*是个一元运算符!!!
    int *ip;//一个整形指针
    float *fp;//浮动指针
    char *cp;//字符指针
    //不管什么类型的指针，其指针变量的值类型都一样，即都是一个十六进制的长的内存地址

    //实例
    int var = 20;
    int *varPtr;
    //优良习惯为赋初始值 int *varPtr = NULL;
    varPtr = &var;

    printf("实例1 var变量值为:%d\n", var);
    printf("实例1 var变量内存地址：%p\n", &var);
    printf("实例1 ip指针的值: %p\n", varPtr);
    printf("实例1 ip指针所指向的值为：%d\n", *varPtr);

    //空指针
    int *ptr = NULL;
    printf("空指针值：%p\n", ptr);
    /* printf("空指针指向的内容:%d\n", *ptr); *///此行会报错
    if (ptr){
        printf("ptr不是空指针\n");
    }else{
        printf("ptr是空指针\n");
    }

    //指针运算
    int arr[] = {100, 200, 300};
    int i, *ptrOperate;
    // ptrOperate = &arr[0];//第一个元素开始
    ptrOperate = arr;//等同于 ptrOperate = &arr[0];
    
    for (i = 0; i < MAX; i++){
        printf("arr[%d] = %d\n", i, arr[i]);
        printf("arr[%d] = %d\n\n", i, *ptrOperate);

        ptrOperate++;//整形的指针，每次加或者减4字节
    }
}